/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package semantico;

import java.util.ArrayList;
import java.util.HashMap;

/**
 *
 * @author gabriel
 */
public class Escopo {

    private int linhaInicial;
    private String tipo;
    private String tipoRetorno;
    private HashMap<String, Declaracao> declaracoes;

    public Escopo() {
    }

    public Escopo(int linhaInicial, String tipo, String tipoRetorno) {
        this.linhaInicial = linhaInicial;
        this.tipo = tipo;
        this.tipoRetorno = tipoRetorno;
        this.declaracoes = new HashMap<String, Declaracao>();
    }

    public int getLinhaInicial() {
        return linhaInicial;
    }

    public void setLinhaInicial(int linhaInicial) {
        this.linhaInicial = linhaInicial;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public String getTipoRetorno() {
        return tipoRetorno;
    }

    public void setTipoRetorno(String tipoRetorno) {
        this.tipoRetorno = tipoRetorno;
    }

    public HashMap<String, Declaracao> getDeclaracoes() {
        return declaracoes;
    }

    public void setDeclaracoes(HashMap<String, Declaracao> declaracoes) {
        this.declaracoes = declaracoes;
    }

    public boolean containsDeclaracao(Declaracao decl) {
        if (declaracoes.containsValue(decl)) {
            return true;
        } else {
            return false;
        }
    }

    public boolean containsDeclaracao(Declaracao decl, String escopo) {
        decl.setEscopo(escopo);
        if (declaracoes.containsValue(decl)) {
            return true;
        } else {
            return false;
        }
    }

    public boolean addDeclaracao(Declaracao decl) {
        if (this.containsDeclaracao(decl)) {
            return false;
        } else {
            declaracoes.put(decl.getIdentificador() + decl.getEscopo(), decl);
            return true;
        }
    }

    public boolean removeDeclaracao(Declaracao decl) {
        if (this.containsDeclaracao(decl)) {
            declaracoes.remove(decl.getIdentificador() + decl.getEscopo());
            return true;
        } else {
            return false;
        }
    }

    public Declaracao getDeclaracao(Declaracao decl) {
        decl = declaracoes.get(decl.getIdentificador() + decl.getEscopo()).clone();
        return decl;
    }

    public Declaracao atualizaDeclaracao(Declaracao decl, String valor) {
        /*if (decl.getIdentificador().contains(".")) {
            decl.setIdentificador(decl.getIdentificador().split("\\.")[0]);
        } else if (decl.getIdentificador().contains("^")) {
            decl.setIdentificador(decl.getIdentificador().replace("^", ""));
        } else if (decl.getIdentificador().contains("&")) {
            decl.setIdentificador(decl.getIdentificador().replace("&", ""));
        } else if (decl.getIdentificador().contains("[]")) {
            decl.setIdentificador(decl.getIdentificador().replace("[]", ""));
        } else {
            declaracoes.get(decl.getIdentificador() + decl.getEscopo()).setValor(valor);
            decl = declaracoes.get(decl.getIdentificador() + decl.getEscopo()).clone();
        }*/
        return decl;
    }
}
